package main

import (
	"bufio"
	"fmt"
	"lnzw/common/proto/cs_gen"
	"lnzw/server/test/test_hotfix/code"
	"os"
	"os/signal"
	"plugin"
	"strings"
	"syscall"
)

// 加载动态链接库插件
func InitPlugins(plg string) {
	p, err := plugin.Open("interimpl/" + plg) //加载动态链接库插件 1个叫做test.so的
	if err != nil {
		panic(err)
	}
	symbol, err := p.Lookup("NewPlugin")
	if err != nil {
		panic(err)
	}
	symbol.(func())()
}

func main() {
	//加载动态链接库插件
	InitPlugins("test.so")

	//实现一个简单的控制台，方便使用动态链接库的动态加载和执行看是否加载成功了
	reader := bufio.NewReader(os.Stdin)
	go func() {
		for {
			fmt.Print("cmd->")
			//控制台标准输入
			cmdinfo, err := reader.ReadString('\n') // 读取整行输入
			if err != nil {
				fmt.Println(err)
				break
			}
			cmdinfo = strings.TrimSpace(cmdinfo) // 去除首尾空白字符
			vals := strings.Fields(cmdinfo)
			cmd := vals[0]
			switch cmd {
			case "reload": // 第一个命令是动态加载插件
				InitPlugins(vals[1])
				fmt.Println("reload success")
			case "login":
				req := cs_gen.ReqLogin{Account: "test", Password: "123456"}
				code.GetCode(1)(&req)
			}

		}
	}()

	//监听ctrl+c退出信号
	c := make(chan os.Signal, 1)
	signal.Notify(c, syscall.SIGINT|syscall.SIGKILL)
	<-c
	fmt.Println("exit")
}
